{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [],
   "source": [
    "import warnings\n",
    "warnings.filterwarnings('ignore')\n",
    "import os\n",
    "from tensorflow.keras.applications.vgg16 import preprocess_input\n",
    "def preprocess_img(x):\n",
    "    return preprocess_input(x, mode='tf')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [],
   "source": [
    "os.environ[\"CUDA_VISIBLE_DEVICES\"] = \"0\"\n",
    "classes = [16, 23,26, 27, 31, 32, 33, 35, 36]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "Using TensorFlow backend.\n"
     ]
    }
   ],
   "source": [
    "from keras.preprocessing.image import ImageDataGenerator\n",
    "from glob import glob\n",
    "import tensorflow as tf\n",
    "import keras\n",
    "import numpy as np\n",
    "import pandas as pd\n",
    "import matplotlib.pyplot as plt\n",
    "from keras.applications.inception_v3 import InceptionV3\n",
    "from keras.applications.xception import Xception\n",
    "from keras.applications.resnet50 import ResNet50\n",
    "from keras.models import Model, Sequential, Input\n",
    "from keras.layers import *\n",
    "from keras.optimizers import Adam,SGD\n",
    "from keras.callbacks import ModelCheckpoint, EarlyStopping\n",
    "import PIL\n",
    "import time"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [],
   "source": [
    "path_data = '../garbage_classify/train_data'\n",
    "batch_size = 48\n",
    "img_width = 224\n",
    "img_height = 224\n",
    "img_size = 224\n",
    "# img_width = 299\n",
    "# img_height = 299\n",
    "# img_size = 299\n",
    "random_seed = 201908\n",
    "path_data_train = '../tmp/data_train/'\n",
    "path_data_valid = '../tmp/data_valid/'\n",
    "labels_file = '../tmp/labels_raw.csv'"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<matplotlib.axes._subplots.AxesSubplot at 0x7f5b099e8ba8>"
      ]
     },
     "execution_count": 5,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "labels_train = pd.read_csv('../tmp/labels_train.csv')\n",
    "labels_valid = pd.read_csv('../tmp/labels_valid.csv')\n",
    "n_classess = labels_train.label.unique().shape[0]\n",
    "labels_train.groupby(by='label').count().plot()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [],
   "source": [
    "labels_train = labels_train[labels_train.label.isin(classes)]\n",
    "labels_valid = labels_valid[labels_valid.label.isin(classes)]\n",
    "\n",
    "labels_train.label = labels_train.label.apply(lambda x: f'{x:02d}')\n",
    "labels_valid.label = labels_valid.label.apply(lambda x: f'{x:02d}')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<matplotlib.axes._subplots.AxesSubplot at 0x7f5b08f77630>"
      ]
     },
     "execution_count": 7,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "labels_train.groupby(by='label').count().plot()\n",
    "labels_valid.groupby(by='label').count().plot()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Found 54000 validated image filenames belonging to 9 classes.\n",
      "Found 647 validated image filenames belonging to 9 classes.\n"
     ]
    }
   ],
   "source": [
    "ig = ImageDataGenerator(preprocessing_function=preprocess_img)\n",
    "\n",
    "params_g = dict(\n",
    "    batch_size=batch_size,\n",
    "    # directory=path_data,\n",
    "    # class_mode='other',\n",
    "    x_col='fname',\n",
    "    y_col='label',\n",
    "    target_size=(img_width, img_height),\n",
    "    seed=random_seed)\n",
    "\n",
    "train_g = ig.flow_from_dataframe(\n",
    "    labels_train, path_data_train, **params_g)\n",
    "valid_g = ig.flow_from_dataframe(\n",
    "    labels_valid, path_data_valid, **params_g)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "WARNING:tensorflow:From /usr/local/lib/python3.6/dist-packages/tensorflow/python/framework/op_def_library.py:263: colocate_with (from tensorflow.python.framework.ops) is deprecated and will be removed in a future version.\n",
      "Instructions for updating:\n",
      "Colocations handled automatically by placer.\n",
      "WARNING:tensorflow:From /usr/local/lib/python3.6/dist-packages/keras/backend/tensorflow_backend.py:3445: calling dropout (from tensorflow.python.ops.nn_ops) with keep_prob is deprecated and will be removed in a future version.\n",
      "Instructions for updating:\n",
      "Please use `rate` instead of `keep_prob`. Rate should be set to `rate = 1 - keep_prob`.\n"
     ]
    }
   ],
   "source": [
    "base_model = Xception(\n",
    "    weights='imagenet', include_top=False, input_shape=(img_width, img_height, 3))\n",
    "\n",
    "x = base_model.output\n",
    "x = GlobalAveragePooling2D()(x)\n",
    "\n",
    "x = Dense(128, activation='relu')(x)\n",
    "x=Dropout(0.3)(x)\n",
    "\n",
    "predictions = Dense(len(classes), activation='softmax')(x)\n",
    "\n",
    "model = Model(inputs=base_model.input, outputs=predictions)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [],
   "source": [
    "ckpt = ModelCheckpoint(\n",
    "    '../tmp/ckpt-bottles-GPU'+os.environ[\"CUDA_VISIBLE_DEVICES\"]+'-'+time.strftime('%Y-%m-%d_%H_%M')+'-Epoch_{epoch:03d}-acc_{acc:.5f}-val_acc_{val_acc:.5f}.h5', save_best_only=True, monitor='val_acc')\n",
    "estop = EarlyStopping(monitor='val_acc', min_delta=1e-7,\n",
    "                      verbose=1, patience=20)\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "WARNING:tensorflow:From /usr/local/lib/python3.6/dist-packages/tensorflow/python/ops/math_ops.py:3066: to_int32 (from tensorflow.python.ops.math_ops) is deprecated and will be removed in a future version.\n",
      "Instructions for updating:\n",
      "Use tf.cast instead.\n",
      "Epoch 1/100\n",
      "1125/1125 [==============================] - 619s 550ms/step - loss: 1.3848 - acc: 0.5420 - val_loss: 0.6804 - val_acc: 0.7917\n",
      "Epoch 2/100\n",
      "1125/1125 [==============================] - 607s 539ms/step - loss: 0.5733 - acc: 0.8183 - val_loss: 0.4904 - val_acc: 0.8447\n",
      "Epoch 3/100\n",
      "1125/1125 [==============================] - 603s 536ms/step - loss: 0.2995 - acc: 0.9112 - val_loss: 0.4712 - val_acc: 0.8631\n",
      "Epoch 4/100\n",
      "1125/1125 [==============================] - 604s 537ms/step - loss: 0.1576 - acc: 0.9555 - val_loss: 0.5252 - val_acc: 0.8531\n",
      "Epoch 5/100\n",
      "1125/1125 [==============================] - 605s 538ms/step - loss: 0.0827 - acc: 0.9791 - val_loss: 0.4886 - val_acc: 0.8715\n",
      "Epoch 6/100\n",
      "1125/1125 [==============================] - 602s 536ms/step - loss: 0.0439 - acc: 0.9908 - val_loss: 0.5553 - val_acc: 0.8681\n",
      "Epoch 7/100\n",
      "1125/1125 [==============================] - 603s 536ms/step - loss: 0.0241 - acc: 0.9953 - val_loss: 0.5754 - val_acc: 0.8564\n",
      "Epoch 8/100\n",
      "1125/1125 [==============================] - 603s 536ms/step - loss: 0.0161 - acc: 0.9973 - val_loss: 0.6094 - val_acc: 0.8598\n",
      "Epoch 9/100\n",
      "1125/1125 [==============================] - 602s 535ms/step - loss: 0.0102 - acc: 0.9982 - val_loss: 0.6794 - val_acc: 0.8497\n",
      "Epoch 10/100\n",
      "1125/1125 [==============================] - 602s 535ms/step - loss: 0.0078 - acc: 0.9987 - val_loss: 0.6149 - val_acc: 0.8631\n",
      "Epoch 11/100\n",
      "1125/1125 [==============================] - 603s 536ms/step - loss: 0.0060 - acc: 0.9989 - val_loss: 0.6621 - val_acc: 0.8731\n",
      "Epoch 12/100\n",
      "1125/1125 [==============================] - 604s 537ms/step - loss: 0.0046 - acc: 0.9993 - val_loss: 0.6781 - val_acc: 0.8614\n",
      "Epoch 13/100\n",
      "  98/1125 [=>............................] - ETA: 9:13 - loss: 0.0052 - acc: 0.9989"
     ]
    }
   ],
   "source": [
    "model.compile(optimizer=Adam(lr=1e-5), loss='categorical_crossentropy',\n",
    "              metrics=['accuracy'])\n",
    "model.fit_generator(\n",
    "    train_g,\n",
    "    # steps_per_epoch=100,\n",
    "    steps_per_epoch=train_g.n // batch_size,\n",
    "    epochs=100,\n",
    "    callbacks=[ckpt, estop],\n",
    "    validation_data=valid_g,\n",
    "    # validation_steps=1,\n",
    "    validation_steps=valid_g.n // batch_size\n",
    ")\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.6.8"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
